在对话框片段和自定义listview适配器之间实现接口时出错

时间:2014-06-05 21:15:31

标签: android listview android-fragments android-listview interface

我正在尝试在片段和自定义列表视图适配器之间实现一个接口,如下所示。然而,每当调用onClick侦听器时,我都会得到一个空指针。这是必要的代码。 对话框片段:

public class MoodDialog extends DialogFragment implements OnClickListener,
    EmoticonClickListener {

ImageView emoticon;
EditText mood;
private Bitmap[] emoticons;

EmoticonClickListener mListener;

GridView emoticonsGrid;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    // Get the layout inflater
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View view = inflater.inflate(R.layout.fragment_mood, null);

    ArrayList<String> emoticonsInAPage = new ArrayList<String>();

    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    builder.setView(view)
            // Add action buttons
            .setPositiveButton("Update",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            // sign in the user ...
                        }
                    })
            .setNegativeButton("Cancel",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            MoodDialog.this.getDialog().cancel();
                        }
                    });

    for (int i = 0; i <= 19; i++) {
        emoticonsInAPage.add(mThumbIds[i]);
    }

    emoticonsGrid = (GridView) view.findViewById(R.id.mood_emoticons_grid);
    MoodEmoticonImageAdapter adapter = new MoodEmoticonImageAdapter(
            getActivity().getApplicationContext(), emoticonsInAPage,
            mListener);

    emoticonsGrid.setAdapter(adapter);

    mood = (EditText) view.findViewById(R.id.mood_edittext_mood);
    emoticon = (ImageView) view.findViewById(R.id.mood_imageView_emoticon);
    emoticon.setOnClickListener(this);
    return builder.create();
}

@Override
public void emoticonClickedIndex(final String index) {
    ImageGetter imageGetter = new ImageGetter() {
        public Drawable getDrawable(String source) {
            StringTokenizer st = new StringTokenizer(index, ".");
            Drawable d = new BitmapDrawable(getResources(),
                    emoticons[Integer.parseInt(st.nextToken()) - 1]);
            d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
            // d.setBounds(0, 0,35, 35);
            return d;
        }
    };

    Spanned cs = Html.fromHtml("<img src ='" + index + "'/>", imageGetter,
            null);

    int cursorPosition = mood.getSelectionStart();
    mood.getText().insert(cursorPosition, cs);

    emoticonsGrid.setVisibility(View.GONE);


}
}

自定义listView适配器:

    package com.gigavia.gigit;

import java.io.InputStream;
import java.util.ArrayList;

import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

public class EmoticonsGridAdapter extends BaseAdapter{

    private ArrayList<String> paths;
    private int pageNumber;
    Context mContext;

    KeyClickListener mListener;

    public EmoticonsGridAdapter(Context context, ArrayList<String> paths, int pageNumber, KeyClickListener listener) {
        this.mContext = context;
        this.paths = paths;
        this.pageNumber = pageNumber;
        this.mListener = listener;
    }
    public View getView(int position, View convertView, ViewGroup parent){

        View v = convertView;
        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.emoticons_item, null);            
        }

        final String path = paths.get(position);

        ImageView image = (ImageView) v.findViewById(R.id.item);
        image.setImageBitmap(getImage(path));

        image.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {               
                mListener.keyClickedIndex(path);
            }
        });

        return v;
    }

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

    @Override
    public String getItem(int position) {       
        return paths.get(position);
    }

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

    public int getPageNumber () {
        return pageNumber;
    }

    private Bitmap getImage (String path) {
        AssetManager mngr = mContext.getAssets();
        InputStream in = null;

         try {
                in = mngr.open("emoticons/" + path);
         } catch (Exception e){
                    e.printStackTrace();
         }

         //BitmapFactory.Options options = new BitmapFactory.Options();
         //options.inSampleSize = chunks;

         Bitmap temp = BitmapFactory.decodeStream(in ,null ,null);
         return temp;
    }

    public interface KeyClickListener {

        public void keyClickedIndex(String index);
    }
}

当调用对话框并单击表情符号时,我收到此错误

06-05 21:04:57.493: E/AndroidRuntime(2588): FATAL EXCEPTION: main
06-05 21:04:57.493: E/AndroidRuntime(2588): java.lang.NullPointerException
06-05 21:04:57.493: E/AndroidRuntime(2588):     at com.gigavia.gigit.MoodEmoticonImageAdapter$1.onClick(MoodEmoticonImageAdapter.java:63)
06-05 21:04:57.493: E/AndroidRuntime(2588):     at android.view.View.performClick(View.java:4204)
06-05 21:04:57.493: E/AndroidRuntime(2588):     at android.view.View$PerformClick.run(View.java:17355)
06-05 21:04:57.493: E/AndroidRuntime(2588):     at android.os.Handler.handleCallback(Handler.java:725)
06-05 21:04:57.493: E/AndroidRuntime(2588):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-05 21:04:57.493: E/AndroidRuntime(2588):     at android.os.Looper.loop(Looper.java:137)
06-05 21:04:57.493: E/AndroidRuntime(2588):     at android.app.ActivityThread.main(ActivityThread.java:5041)
06-05 21:04:57.493: E/AndroidRuntime(2588):     at java.lang.reflect.Method.invokeNative(Native Method)
06-05 21:04:57.493: E/AndroidRuntime(2588):     at java.lang.reflect.Method.invoke(Method.java:511)
06-05 21:04:57.493: E/AndroidRuntime(2588):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)

第63行

mListener.keyClickedIndex(path);

我将非常感谢帮助解决这个问题。谢谢。

1 个答案:

答案 0 :(得分:0)

基于Log的这一部分:

.gigit.MoodEmoticonImageAdapter$1.onClick(MoodEmoticonImageAdapter.java:63)

它表示异常是由onClick()的匿名内部类($1)的MoodEmoticonImageAdapter方法引起的。您正在向我们展示不同适配器的代码。

无论如何,错误是由于您传递的是未初始化的数据成员( EmoticonClickListener mListener),当您应该传递this作为参数时,如下所示:

MoodEmoticonImageAdapter adapter = new MoodEmoticonImageAdapter(
        getActivity().getApplicationContext(), emoticonsInAPage, this);

由于MoodDialog正在实施EmoticonClickListener,您希望将其作为参考传递,以便MoodEmoticonImageAdapter可以调用方法emoticonClickedIndex()