在OnItemClickListener上访问适配器内的imageview

时间:2015-05-04 21:27:29

标签: android android-adapter onitemclicklistener

我的导航抽屉包含许多项目。每个项目都有不可见的背景图片(标识为optionbackground)。我想只在用户点击项目时才能看到图像。我该怎么做?我想要更改其visiblity的ImageView在Adapter中被命名为optionBackground。我的setOnItemClickListener处于活动状态,我正在为导航抽屉设置自定义适配器。

活动

mDrawerList.setAdapter(new CustomAdapter(this, mdrawerTitles));
mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    if(position==0)
    {
      ...
    }
    else if(position==1)
    {
      ...
    }
  }
});

适配器

public class CustomAdapter extends ArrayAdapter
{
    private final Context context;
private String[] optionList;
    public CustomAdapter(Context context,String[] data)
    {
       super(context, R.layout.drawer_list_item);
       this.context = context;
        optionList=data;
    }
    @Override
    public int getCount() {
        return optionList.length;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View v = inflater.inflate(R.layout.drawer_list_item, parent, false);
        ImageView icon=(ImageView)v.findViewById(R.id.optionlogo);
        TextView optiontext=(TextView)v.findViewById(R.id.optiontext);
        TextView optionsubtext=(TextView)v.findViewById(R.id.optionsubtext);
        ImageView optionBackground=(ImageView)v.findViewById(R.id.optionbackground);

        Log.e("bhuvnesh", optionList[position]);
        if(optionList[position].equals("ABOUT")) {


            optiontext.setText("AB");
            icon.setImageResource(R.drawable.g_icon);
            optionsubtext.setText("The what");
        }
        else if(optionList[position].equals("SHAR")) {
            optiontext.setText("SHA");
            icon.setImageResource(R.drawable.s_icon);
            optionsubtext.setText("Tell your ");
        }
        else if(optionList[position].equals("CONNEC")) {
            optiontext.setText("CONN");
            icon.setImageResource(R.drawable.fb_icon);
            optionsubtext.setVisibility(View.GONE);
        }
        else if(optionList[position].equals("LOG")) {
            optiontext.setText("LOGOUT");
            icon.setImageResource(R.drawable.l_icon);
            optionsubtext.setVisibility(View.GONE);
        }


        return v;
    }
}

3 个答案:

答案 0 :(得分:1)

有多种解决方案可以解决此问题。

您可以通过 onClickListener

中的视图获取要隐藏/显示的视图
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
   view.findViewById(R.id.optionbackground).setVisibility(View.VISIBLE);
   ...
}

或者在适配器中定义 onClickListener 并保持最终的视图。因此,您可以在 onClick 事件中设置可见性。

View v = inflater.inflate(R.layout.drawer_list_item, parent, false);
...
final ImageView optionBackground=(ImageView)v.findViewById(R.id.optionbackground);

v.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        optionBackground.setVisibility(View.VISIBLE);
    }
});

...

如果您打算更新到RecyclerView。此视图不再带有onItemClickListener,您需要将Listener添加到Adapter内的视图中。

您仍然可以将其传递给包含的活动或片段,因为我已经在我的一个开源项目中完成了它:

https://github.com/mikepenz/wallsplash-android/blob/master/app/src/main/java/com/mikepenz/unsplash/views/adapters/ImageAdapter.java#L178

有关显示它并将其隐藏在onTouch上的其他信息

.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                //press
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                //unpress
                break;
        }

        // Pass all events through to the host view.
        return false;
    }
}

答案 1 :(得分:0)

dumazy的方法很好,但也有另一种解决方案。您可以在适配器的getView方法中创建onclick方法。 这是一个例子

  final ImageView optionBackground=   (ImageView)v.findViewById(R.id.optionbackground);

      v.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            optionBackground.setVisibility(View.VISIBLE);
        }
    });

答案 2 :(得分:0)

onItemClick方法中,您拥有视图参数。此参数是查看,其中包含您在 CustomAdapter 中的getView方法中夸大的所有元素。

因此,为了实现您想要实现的目标,您只需使用其ID检索 ImageView 并设置其可见性。

mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    {
        view.getViewById(R.id.optionBackground).setVisibility(View.VISIBLE);
    }
});

那就是它。