【问题标题】:How to change the background color of a list item at click on a button?如何在单击按钮时更改列表项的背景颜色?
【发布时间】:2019-04-22 13:31:51
【问题描述】:

我有一个 ListView 和一个 CustomAdapter。元素都已成功加载到列表中。现在我想通过单击外部按钮来更改列表中某个元素的背景颜色。但我不知道如何访问列表中的特定项目。

这是 CustomAdapter 类:

public class CustomAdapter extends BaseAdapter {

    private Context ctx;
    private int resource;
    private List<ItemModel> items;


    public PreorderListAdapter(Context context, int resource, List<ItemModel> items){
        this.ctx = context;
        this.resource = resource;
        this.items = items;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public ItemModel getItem(int position) {
        return items.get(position);
    }

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

    @NonNull
    @Override
    public View getView(int i, View convertView, @NonNull ViewGroup parent) {

        View view = convertView;

        if(view == null){
            LayoutInflater inflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(resource, null);
        }


        TextView text1 = (TextView) view.findViewById(R.id.text1);
        TextView text2 = (TextView) view.findViewById(R.id.text2);
        TextView text3 = (TextView) view.findViewById(R.id.text3);

        ItemModel item = items.get(i);

        text1.setText(item.getName());
        text2.setText(item.getOption2());
        text3.setText(item.getOption3());

        return view;
    }
}

【问题讨论】:

    标签: java android listview baseadapter


    【解决方案1】:

    您可以在 getView() 方法中这样做

    view.setOnClickListener(new OnClickListener() 
       { 
         @Override
         public void onClick(View v)
             { 
               view.setBackgroundColor(ContextCompat.getColor(this, R.color.yourcolor));
              }
       });
    

    如果您的视图上有一个按钮,则在该按钮上执行侦听器

    如果您想从您的父活动中获取您选择的项目视图,那么:

    yourlistview.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    { 
     @Override 
      public void onItemClick(AdapterView<?>     parent,View view, int position, long id) 
        { 
           selectedposition = position ;
         }
      });
    
    
      View view = listView.getAdapter().getView(selectedposition,null,listview);
    

    然后改变它的背景:

    view.setBackgroundColor(ContextCompat.getColor(this, R.color.yourcolor));
    

    请在您的 color.xml 文件中定义您的颜色

    如果您有多个视图,则创建一个ArrayList&lt;View&gt; 并执行一些循环

    【讨论】:

    • 我不想点击某个项目。我想在我的 MainActivity 中单击一个外部按钮。
    • Okei,所以你必须先选择那个项目吧?
    • 使用特定方法在您的适配器中创建一个侦听器,例如:
    • 没有。在 MainActivity 我确定我需要在列表中的哪个位置。我没有手动选择列表项。
    • 这就是我得到的:java.lang.RuntimeException:无法启动活动 ComponentInfo{...}:java.lang.NullPointerException:尝试调用虚拟方法 'void android.view.View.setBackgroundColor (int)' 在空对象引用上
    【解决方案2】:

    在您的活动和您的 适配器将实现这一点。

    public interface OnClickListenerFromActivity {
        void onActivityButtonClick(int position);
    }
    

    点击你的按钮调用你的监听方法

        mOnClickListenerFromActivity.onActivityButtonClick(mList.getItem(yourPostion));
    

    将此侦听器实现到您的适配器中

    public class CustomAdapter extends BaseAdapter implements Activity.OnClickListenerFromActivity {
    
    private Context ctx;
    private int resource;
    private List<ItemModel> items;
    
    
    public PreorderListAdapter(Context context, int resource, List<ItemModel> items){
        this.ctx = context;
        this.resource = resource;
        this.items = items;
    }
    
    @Override
    public int getCount() {
        return items.size();
    }
    
    @Override
    public ItemModel getItem(int position) {
        return items.get(position);
    }
    
    @Override
    public long getItemId(int position) {
        return position;
    }
    
    @NonNull
    @Override
    public View getView(int i, View convertView, @NonNull ViewGroup parent) {
    
        View view = convertView;
    
        if(view == null){
            LayoutInflater inflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(resource, null);
        }
    
    
        TextView text1 = (TextView) view.findViewById(R.id.text1);
        TextView text2 = (TextView) view.findViewById(R.id.text2);
        TextView text3 = (TextView) view.findViewById(R.id.text3);
    
        ItemModel item = items.get(i);
    
        text1.setText(item.getName());
        text2.setText(item.getOption2());
        text3.setText(item.getOption3());
    
        return view;
    }
    
    public void onActivityButtonClick(int position) {
        // get your item through position and
        // set your color here
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-09
      • 2017-08-02
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 2014-10-10
      • 2020-09-13
      相关资源
      最近更新 更多