0

listView の 2 つのビュー (checkedtextview と通常の textview) を表示するアダプターがあります。ユーザーがMarkModeアイテムをマークできるように、ユーザーが入っているときにcheckedtextviewを使用したいのですが、ユーザーが入っていないときにtextviewを使用したいのですMarkMode

だから、ここに私の元のコードがありMarkModeます.

public class ContactsAdapter extends BaseAdapter {

    private List<Contact> mData;
    private LayoutInflater mInflater;
    private Context context;

    public ContactsAdapter(List<Contact> mData, Context context) {
        this.mData = mData;
        this.context = context;
        mInflater = LayoutInflater.from(context);
    }

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

    @Override
    public String getItem(int position) {
        switch (context.getSharedPreferences("settings",
                HomeScreenActivity.MODE_PRIVATE).getInt("displayChoice", -1)) {
        case 1:
            return mData.get(position).getLastName() + " "
                    + mData.get(position).getFirstName();
        case 2:
            return mData.get(position).getFirstName() + " "
                    + mData.get(position).getMobileNumber();
        case 3:
            return mData.get(position).getLastName() + " "
                    + mData.get(position).getMobileNumber();
        default:
            return mData.get(position).getFirstName() + " "
                    + mData.get(position).getLastName();
        }
    }

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

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

        CheckedTextView result;

        if (convertView == null) {
            result = (CheckedTextView) mInflater.inflate(
                    R.layout.home_screen_contacts_mark_view, parent, false);
        } else {
            result = (CheckedTextView) convertView;
        }

        final String contactRow = getItem(position);
        result.setText(contactRow);
        result.setBackgroundResource(R.drawable.list_selector);

        return result;
    }

}

そして今、これに変更したので、呼び出されたクラス変数を変更しisMarkModeて、別のビューを表示できます...

public class ContactsAdapter extends BaseAdapter {

    private List<Contact> mData;
    private LayoutInflater mInflater;
    private Context context;
    public static boolean inMarkMode = false;
    public ContactsAdapter(List<Contact> mData, Context context) {
        this.mData = mData;
        this.context = context;
        mInflater = LayoutInflater.from(context);
    }

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

    @Override
    public String getItem(int position) {
        switch (context.getSharedPreferences("settings",
                HomeScreenActivity.MODE_PRIVATE).getInt("displayChoice", -1)) {
        case 1:
            return mData.get(position).getLastName() + " "
                    + mData.get(position).getFirstName();
        case 2:
            return mData.get(position).getFirstName() + " "
                    + mData.get(position).getMobileNumber();
        case 3:
            return mData.get(position).getLastName() + " "
                    + mData.get(position).getMobileNumber();
        default:
            return mData.get(position).getFirstName() + " "
                    + mData.get(position).getLastName();
        }
    }

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

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

                CheckedTextView result = null;
        TextView normalResult = null;

        if (inMarkMode) {
            if (convertView == null) {
                result = (CheckedTextView) mInflater.inflate(
                        R.layout.home_screen_contacts_mark_view, parent, false);
            } else {
                result = (CheckedTextView) convertView;
            }
        } else {
            if (convertView == null) {
                normalResult = (TextView) mInflater.inflate(
                        R.layout.home_screen_contacts_view, parent, false);
            } else {
                normalResult = (TextView) convertView;
            }
        }
        final String contactRow = getItem(position);
        result.setText(contactRow);
        result.setBackgroundResource(R.drawable.list_selector);
        normalResult.setText(contactRow);
        normalResult.setBackgroundResource(R.drawable.list_selector);

        if (inMarkMode) {
            return result;
        } else {
            return normalResult;
        }
    }
    }

}

最初は動作しているように見えますが、その後停止し、次の行にあるという logcat エラーが発生しますNullPointerExceptionresult.setText(contactRow);

どうすればこれを修正できますか? どんな助けでも大歓迎です。

4

2 に答える 2

1

resultが初期化されていない場合inMarkModeがありfalseます。次の場合はresult.setText(contactRow);if ブロック内に移動します。inMarkModetrue

 final String contactRow = getItem(position);
 if (inMarkMode) {
            //.....your code here..
            result.setText(contactRow);
            result.setBackgroundResource(R.drawable.list_selector);
  } else {
             //.....your code here..
            normalResult.setText(contactRow);
            normalResult.setBackgroundResource(R.drawable.list_selector);
        }
于 2013-10-12T11:48:45.680 に答える
0

Getview メソッドをこれに変更します

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

            CheckedTextView result = null;
            TextView normalResult = null;

            if (inMarkMode) {
                if (convertView == null) {
                    result = (CheckedTextView) mInflater.inflate(
                            R.layout.home_screen_contacts_mark_view, parent, false);
                } else {
                    result = (CheckedTextView) convertView;
                }
            } else {
                if (convertView == null) {
                    normalResult = (TextView) mInflater.inflate(
                            R.layout.home_screen_contacts_view, parent, false);
                } else {
                    normalResult = (TextView) convertView;
                }

            }
final String contactRow = getItem(position);

            if (inMarkMode) {

            result.setText(contactRow);
            result.setBackgroundResource(R.drawable.list_selector);
                return result;
            } else {
            normalResult.setText(contactRow);
            normalResult.setBackgroundResource(R.drawable.list_selector);
                return normalResult;
            }
        }
        } 
于 2013-10-12T11:54:21.643 に答える