2017-05-08 69 views
0

如何为我的课程创建自定义setOnClickListener?通过MainActivity在ListAdapter中的项目上设置onClickListener

我目前有一个listAdapter项目(作出了一个项目类)。每当我点击列表中的一个项目时,我想激活我在MainActivity中描述的功能。我想为我的列表适配器中的类设置onClickListeners(自定义onClickListeners)。我该怎么做?

如果你不理解我,或者想帮助,我拉上该项目,并把它放在我Google Drive

我已经通过几十个答案的看了看,但是我无法找到一个正在工作..请帮助,因为我在这方面投入了很多时间。

Item item = new Item().setOnClickListener(new ItemListAdapter.ClickListener() { 
    @Override 
    public void onClick() { 
     Toast.makeText(MainActivity.this, "Clicked me", Toast.LENGTH_SHORT).show(); 
    } 
}); 

编辑:因为我想以后把它变成一个库,这将是我和你可以在项目设置的onclick而不是列表视图,我想隐藏用户有用从用户最终

+0

你想用逻辑完全做什么? – Krish

+0

我编辑了我的问题,也许这解释了我确切需要的 – Jason

+0

为什么在活动中实现ClickListener?有什么理由吗? – Krish

回答

1

从我的理解你正在寻找一些像这样的事情,更改这样的类,

public class Item { 

    private int id; 
    private ItemListAdapter.ClickListener mClickListener; 

    public Item(int id) { 
     this.id = id; 
    } 


    public Item(int id, @NonNull ItemListAdapter.ClickListener clickListener) { 
     this.id = id; 
     this.mClickListener = clickListener; 
    } 


    public Item setOnClickListener(@NonNull ItemListAdapter.ClickListener clickListener) { 
     this.mClickListener = clickListener; 
     return this; 
    } 


    public ItemListAdapter.ClickListener getClickListener() { 
     return this.mClickListener; 
    } 

} 

适配器类

import android.content.Context; 
import android.support.annotation.NonNull; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.LinearLayout; 

public class ItemListAdapter extends ArrayAdapter<Item> { 


    public ItemListAdapter(Context context, int resource) { 
     super(context, resource, SettingsStorage.getInstance().getItems()); 
    } 

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


     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.item, parent, false); 
     } 

     final Item item = getItem(position); 
     LinearLayout linearLayout = (LinearLayout) convertView.findViewById(R.id.item); 
     linearLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (item.getClickListener() != null) { 
        item.getClickListener().onClick(); 
       } 
      } 
     }); 

     return convertView; 
    } 

    public interface ClickListener { 
     void onClick(); 
    } 
} 

,你可以设置监听器e这,

Item item1 = new Item(1); 
     item1.setOnClickListener(new ItemListAdapter.ClickListener() { 
      @Override 
      public void onClick() { 
       Toast.makeText(MainActivity.this, "It works", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     Item item2 = new Item(2, new ItemListAdapter.ClickListener() { 
      @Override 
      public void onClick() { 

      } 
     }); 
+0

你。是。我的。英雄。非常感谢!我已经浪费了过去2周的时间,并为你解决了这个问题!我不能够感谢你! – Jason

+0

但我会建议通过点击监听器中的项目。 – Krish

+0

好的!明天将会看到它(差不多是12点),谢谢! – Jason

0

您可以使用OnItemClickListener

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     Item item = adapter.getItem(position); 
    } 
}); 

编辑: 的是,Item是只是一个POJO,你不能“点击”它。你可以做的是一种“转发”听众:

Class Item { 
    private ItemClickListener listener; 

    // getter/setter 

    interface ItemClickListener{ 
     void onItemClick(Item item); 
    } 
} 

// you implement this in your library 
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     Item item = adapter.getItem(position); 
     item.getListener().onItemClick(item); 
    } 
}); 
+0

我知道,但因为它会导致图书馆,我想要做项目的选项。setOnClickListener而不是用户访问列表视图本身 – Jason

+0

看到我编辑的答案 –

+0

我见过其他图书馆做同样的事情,但我似乎无法重现..例如从迈克·彭斯“材料抽屉”。 – Jason

相关问题