2015-08-16 79 views
3

所以我有一个自定义的listview。这就像每个列表项目中带有1个图像和一堆按钮的Instagram布局。所以这里的问题:从适配器回拨

我想实现共享按钮。为此,我尝试创建一个从适配器到活动的回调。但它似乎没有工作。以下是我迄今为止(我冒出了不相关的部分):

MainActivity

public class MainActivity extends ActionBarActivity implements ListAdapter.OnShareClickedListener{ 

    ListView main_list; 
    List<String> url_list; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     main_list = (ListView) findViewById(R.id.listView); 
     ListAdapter nListAdapter = new ListAdapter(context, url_list); 
     main_list.setAdapter(nListAdapter); 
    } 

    @Override 
    public void ShareClicked(String url) { 
     Log.e("Test",url); 
    } 

} 

ListAdapter

public class ListAdapter extends BaseAdapter implements View.OnClickListener { 

    OnShareClickedListener mCallback; 
    Context context; 
    public static List<String> url_list; 

    public ListAdapter(Context c, List<String> list) { 
     this.context = c; 
     url_list = list; 
    } 

    public interface OnShareClickedListener { 
     public void ShareClicked(String url); 
    } 


    @Override 
    public void onClick(View v) { 
       mCallback.ShareClicked("Share this text."); 
     } 
    } 

} 

Error Log:

Attempt to invoke interface method 'void com.packagename.ListAdapter$OnShareClickedListener.ShareClicked(java.lang.String)' on a null object reference 
+0

我在哪里创建?在onclick? – Wiillyx3

+0

不能给出错误: OnShareClickedListener是抽象的。无法实例化。 – Wiillyx3

回答

5

你需要告诉适配器,它实现OnShareClickedListener的( )来使用。现在在适配器中,字段mCallback从不分配给您,您需要在适配器中有一个setOnSharedClickedListener()方法,然后您可以从mainActivity调用该方法,并将其设置为主活动的实现,或者您需要接受构造函数。

我的建议是使用setter而不是构造函数。所以你需要做的是这个。

你ListAdapter

public class ListAdapter extends BaseAdapter implements View.OnClickListener { 

    OnShareClickedListener mCallback; 
    Context context; 
    public static List<String> url_list; 

    public ListAdapter(Context c, List<String> list) { 
     this.context = c; 
     url_list = list; 
    } 

    public void setOnShareClickedListener(OnShareClickedListener mCallback) { 
     this.mCallback = mCallback; 
    } 

    public interface OnShareClickedListener { 
     public void ShareClicked(String url); 
    } 


    @Override 
    public void onClick(View v) { 
     mCallback.ShareClicked("Share this text."); 
    } 
} 

你MainActivty

public class MainActivity extends ActionBarActivity implements ListAdapter.OnShareClickedListener{ 

    ListView main_list; 
    List<String> url_list; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     main_list = (ListView) findViewById(R.id.listView); 
     ListAdapter nListAdapter = new ListAdapter(this, url_list); 
     nListAdapter.setOnShareClickedListener(this); 
     main_list.setAdapter(nListAdapter); 
    } 

    @Override 
    public void ShareClicked(String url) { 
     Log.e("Test", url); 
    } 

} 
+0

这很好,谢谢! – Wiillyx3

+0

您必须在您的活动中实例化OnShareClickedListener,并在您的List适配器的构造函数中传递该实例。为传递OnShareClickedListener实例分配mCallback。你的代码的问题是你没有初始化Listener对象。 –

+0

我喜欢从适配器初始化中解耦合回调 – Bhargav