【问题标题】:Confusion about retrieving Views from ListView从 ListView 检索视图的困惑
【发布时间】:2018-03-10 05:03:00
【问题描述】:

我试图在 Android 应用中创建一个简单的ListView 并更改视图的背景颜色。

我通过简单地覆盖定义的ArrayAdapter 类的getView() 方法并在其中更改它就成功了。

ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
         android.R.layout.simple_list_item_1, Categories) {
  @Override
  public View getView(int pos, View v, ViewGroup vg) {
    View view = super.getView(pos, v, vg);

    switch (pos) {
      case 0:
        view.setBackgroundColor(Color.RED);
        break;
      case 1:
        view.setBackgroundColor(Color.BLUE);
        break;
      default:
        break;
    }

    return view;
  }
};

但是,如果我删除 switch 语句并在返回视图的此函数之外使用它,则颜色不会更新。我的意思是这样的:(lv 是我的ListView

lv.setAdapter(arrayAdapter);
for (int i=0; i<2; ++i) {
  View V = (View) lv.getAdapter().getView(i, null, lv);

  switch (i) {
    case 0:
      V.setBackgroundColor(Color.RED);
      break;
    case 1:
      V.setBackgroundColor(Color.BLUE);
      break;
    default:
      break;
  }
}

它确实返回了对视图的引用,那么为什么它不能那样工作呢?

【问题讨论】:

  • 你能贴出代码:delete the switch-statement and use it outside this function with the returned view吗?我不确定我是否理解你在那里做了什么。
  • 我编辑了我的帖子以使其更清晰。
  • 您在onCreate 中有此代码?另外,您在第二种情况下是否收到任何异常?

标签: android listview view colors android-arrayadapter


【解决方案1】:

你应该使用接口: 在 YourAdapter.class 中定义一个接口:

    public interface OnColorEvent{
     void change(View v,int position)
 }

在 YourAdapter.class 中设置监听器:

private OnColorEvent e;
public void setOnColorEvent(OnColorEvent e)
{
this.e=e;
}

在您的 getView() 方法中:

    @Override
      public View getView(int pos, View v, ViewGroup vg) {
        View view = super.getView(pos, v, vg);
    if(null!=e)
    {
    e.change(v,pos);
    }
    }
In YourActivity.class:
listview.setOnColorEvent(new OnColorEvent{
@Overide
public void change(View v,int position)
{
switch (position) {
    case 0:
      V.setBackgroundColor(Color.RED);
      break;
    case 1:
      V.setBackgroundColor(Color.BLUE);
      break;
    default:
      break;
  }
}
});

【讨论】:

    【解决方案2】:

    我建议你使用RecyclerView 而不是ListView。一旦我创建了一个彩色列表。这里我只是复制我的代码。

    public class MyListAdapter extends RecyclerView.Adapter<MyListAdapter.ViewHolder>{
        private final ArrayList<String> dataSet;
    
        class ViewHolder extends RecyclerView.ViewHolder {
            final TextView mTextView;
            final CardView cardView;
            ViewHolder(View v) {
                super(v);
                mTextView = (TextView) v.findViewById(R.id.info_text);
                cardView = (CardView) v.findViewById(R.id.item_container);
            }
        }
    
        public MyListAdapter(ArrayList<String> myDataset) {
            dataSet = myDataset;
        }
    
        @Override
        public MyListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_card, parent, false);
            return new ViewHolder(view);
        }
    
    
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
            holder.mTextView.setText(dataSet.get(position));
            switch (position%11){
                case 0: holder.cardView.setCardBackgroundColor(0xFFB71C1C);
                    break;
                case 1: holder.cardView.setCardBackgroundColor(0xFF880E4F);
                    break;
                case 2: holder.cardView.setCardBackgroundColor(0xFF4A148C);
                    break;
                case 3: holder.cardView.setCardBackgroundColor(0xFF311B92);
                    break;
                case 4: holder.cardView.setCardBackgroundColor(0xFF1A237E);
                    break;
                case 5: holder.cardView.setCardBackgroundColor(0xFF01579B);
                    break;
                case 6: holder.cardView.setCardBackgroundColor(0xFF004D40);
                    break;
                case 7: holder.cardView.setCardBackgroundColor(0xFF1B5E20);
                    break;
                case 8: holder.cardView.setCardBackgroundColor(0xFF33691E);
                    break;
                case 9: holder.cardView.setCardBackgroundColor(0xFF827717);
                    break;
                case 10: holder.cardView.setCardBackgroundColor(0xFFE65100);
                    break;
                default: holder.cardView.setCardBackgroundColor(0xFFBF360C);
            }
        }
    
        @Override
        public int getItemCount() {
            return dataSet.size();
        }
    }
    

    【讨论】:

      【解决方案3】:

      每当您更改某些内容时,请致电:

      ArrayAdapter.notifyDataSetChanged();
      

      无论如何,这不是英国的好方法,但我想每个解决方案都是一个解决方案¯_(ツ)_/¯

      【讨论】:

      • 遗憾的是这并没有解决它
      • 这部分是正确的。如果您从adapter 更改数据,您需要调用notifyDataSetChanged 以在您的屏幕上反映这些更改。但是,如果您有对视图的引用,则可以更改它的显示方式而无需调用它。
      • 在原帖中,我尝试了 arrayAdapter.notifyDataSetChanged();和 ((ArrayAdapter)lv.getAdapter()).notifyDataSetChanged();单独在 switch 语句之后。
      • 当您将 null 作为您的 convertView 传递时,您必须先扩充您的视图。
      • LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(android.R.layout.simple_list_item_1, null);
      猜你喜欢
      • 1970-01-01
      • 2013-07-04
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多