2017-05-08 70 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

相關問題