有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android ListView在触摸屏上不显示动画?

当我按下列表中的某个项目时,我使用过的每个列表视图都会自动提供动画更改功能。也就是说,天会变黑,稍微下沉。然而,我目前正在研究的一个并不是以同样的方式工作的。我想知道是否有人能告诉我原因

import 安卓.app.ListActivity;
import 安卓.content.Context;
import 安卓.os.Bundle;
import 安卓.view.LayoutInflater;
import 安卓.view.View;
import 安卓.view.ViewGroup;
import 安卓.widget.BaseAdapter;
import 安卓.widget.TextView;
import 安卓.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends ListActivity {

    private MenuAdapter mAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mAdapter = new MenuAdapter();
        for (int i = 1; i < 50; i++) {
            mAdapter.addItem("Food Item " + i);
            if (i % 4 == 0) {
                mAdapter.addSeparatorItem("Category " + i);
            }
        }
        setListAdapter(mAdapter);
    }

    private class MenuAdapter extends BaseAdapter {

        private static final int TYPE_ITEM = 0;
        private static final int TYPE_SEPARATOR = 1;
        private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;

        private ArrayList<String> mData = new ArrayList<String>();
        private LayoutInflater mInflater;

        private ArrayList<Integer> mSeparatorsSet = new ArrayList<Integer>();

        public MenuAdapter() {
            mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        public void addItem(final String item) {
            mData.add(item);
            notifyDataSetChanged();
        }

        public void addSeparatorItem(final String item) {
            mData.add(item);
            // save separator position
            mSeparatorsSet.add(mData.size() - 1);
            notifyDataSetChanged();
        }

        @Override
        public int getItemViewType(int position) {
            return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
        }

        @Override
        public int getViewTypeCount() {
            return TYPE_MAX_COUNT;
        }

        public int getCount() {
            return mData.size();
        }

        public String getItem(int position) {
            return mData.get(position);
        }

        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            int type = getItemViewType(position);
            if (convertView == null) {
                holder = new ViewHolder();
                switch (type) {
                    case TYPE_ITEM:
                        convertView = mInflater.inflate(R.layout.item1, null);
                        convertView.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                Toast.makeText(getApplicationContext(),
                                        "Click", Toast.LENGTH_LONG).show();
                            }
                        });
                        holder.textView = (TextView)convertView.findViewById(R.id.text);
                        break;
                    case TYPE_SEPARATOR:
                        convertView = mInflater.inflate(R.layout.item2, null);
                        holder.textView = (TextView)convertView.findViewById(R.id.textSeparator);
                        break;
                }
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.textView.setText(mData.get(position));
            return convertView;
        }

    }

    public static class ViewHolder {
        public TextView textView;
    }
}

共 (2) 个答案

  1. # 1 楼答案

    因此,我决定从头开始重建自己的解决方案。这比我见过的创建带有标题的列表视图的任何演示代码都要简单得多。当然,我将使用不同的布局,而不是简单地改变颜色,但这仍然是一个工作的概念

    import android.content.Context;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.support.v7.app.ActionBarActivity;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.ListAdapter;
    import android.widget.ListView;
    import android.widget.TextView;
    
    import java.util.ArrayList;
    
    
    public class MainActivity extends FragmentActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ArrayList<MenuObject> objects = new ArrayList<MenuObject>();
    
            for(int i = 0; i <= 50; i++)
            {
                MenuObject tempObject;
                if(i % 5 == 0)
                tempObject = new MenuObject
                        (MenuObject.ObjectType.Category_Header, "Category " + i, "0");
    
                else tempObject = new MenuObject
                        (MenuObject.ObjectType.Food_Item, "Item " + i, "0");
    
                objects.add(tempObject);
            }
    
            ListAdapter theAdapter = new MenuAdapter(this, objects);
            ListView theListView = (ListView) findViewById(R.id.listView1);
            theListView.setAdapter(theAdapter);
        }
    
        class MenuAdapter extends ArrayAdapter<MenuObject> {
    
            public MenuAdapter(Context context, ArrayList<MenuObject> values) {
                super(context, R.layout.row_layout, values);
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
    
                LayoutInflater theInflater = LayoutInflater.from(getContext());
                View theView = theInflater.inflate(R.layout.row_layout, parent, false);
    
                MenuObject obj = getItem(position);
    
                if(obj.m_Type == MenuObject.ObjectType.Category_Header) {
                    TextView theTextView = (TextView) theView.findViewById(R.id.textView1);
                    theTextView.setText(obj.m_Name);
                    theView.setBackgroundColor(Color.parseColor("#FFB51202"));
                }
    
                else {
                    TextView theTextView = (TextView) theView.findViewById(R.id.textView1);
                    theTextView.setText(obj.m_Name);
                }
    
                return theView;
            }
        }
    }
    
  2. # 2 楼答案

    根据您的确认,一旦我们删除ViewHolder图案。很好用。因为viewholder主题不同于正常的现有行为

    所以代码应该是这样的

    @Override
            public View getView(int position, View convertView, ViewGroup parent) {
    
                LayoutInflater theInflater = LayoutInflater.from(getContext());
                View theView = theInflater.inflate(R.layout.row_layout, parent, false);
    
                MenuObject obj = getItem(position);
    
                if(obj.m_Type == MenuObject.ObjectType.Category_Header) {
                    TextView theTextView = (TextView) theView.findViewById(R.id.textView1);
                    theTextView.setText(obj.m_Name);
                    theView.setBackgroundColor(Color.parseColor("#FFB51202"));
                }
    
                else {
                    TextView theTextView = (TextView) theView.findViewById(R.id.textView1);
                    theTextView.setText(obj.m_Name);
                }
    
                return theView;
            }