getView, использующий пользовательский список, получающий нулевое исключение - PullRequest
0 голосов
/ 20 марта 2012
03-19 23:38:21.952: E/AndroidRuntime(400): FATAL EXCEPTION: main
03-19 23:38:21.952: E/AndroidRuntime(400): java.lang.NullPointerException
03-19 23:38:21.952: E/AndroidRuntime(400):  at net.website.custom_listview.Lazy_Adapter_Custom_Listview$1.onClick(Lazy_Adapter_Custom_Listview.java:75)
03-19 23:38:21.952: E/AndroidRuntime(400):  at android.view.View.performClick(View.java:2485)
03-19 23:38:21.952: E/AndroidRuntime(400):  at android.view.View$PerformClick.run(View.java:9080)
03-19 23:38:21.952: E/AndroidRuntime(400):  at android.os.Handler.handleCallback(Handler.java:587)
03-19 23:38:21.952: E/AndroidRuntime(400):  at android.os.Handler.dispatchMessage(Handler.java:92)
03-19 23:38:21.952: E/AndroidRuntime(400):  at android.os.Looper.loop(Looper.java:123)
03-19 23:38:21.952: E/AndroidRuntime(400):  at android.app.ActivityThread.main(ActivityThread.java:3683)
03-19 23:38:21.952: E/AndroidRuntime(400):  at java.lang.reflect.Method.invokeNative(Native Method)
03-19 23:38:21.952: E/AndroidRuntime(400):  at java.lang.reflect.Method.invoke(Method.java:507)
03-19 23:38:21.952: E/AndroidRuntime(400):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-19 23:38:21.952: E/AndroidRuntime(400):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-19 23:38:21.952: E/AndroidRuntime(400):  at dalvik.system.NativeStart.main(Native Method)

Я не уверен, что не так в этом коде ниже, но я получаю нулевое исключение (исполнитель)

ps: textview действительно существует в файле макета.

 public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        if(convertView==null)
            vi = inflater.inflate(R.layout.list_row_custom_listview, null);


        TextView artist = (TextView)vi.findViewById(R.id.artist); // artist name 
        TextView link = (TextView)vi.findViewById(R.id.txtLink);


        // Setting all values in listview 
        artist.setText(song.get(Main_Activity_Custom_Listview.KEY_TITLE_ENGLISH));

        link.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
        int duration = Toast.LENGTH_SHORT;


        TextView tx =(TextView)v.findViewById(R.id.txtLink); //null exception???
        TextView artist = (TextView)v.findViewById(R.id.artist); // null exception???

        Log.v("link>>", "onItemClick at position" + artist.getText());

        //Toast toast = Toast.makeText(PlayListActivity.this, tx.getText(), duration);
        //toast.show(); 
        }
    }); 
        return vi;
    }

Ответы [ 3 ]

1 голос
/ 14 февраля 2013
public View getView(final int position, View convertView, ViewGroup parent) {
    .
    .
    .

    vi.findViewById(R.id.dots).setOnClickListener(new OnClickListener() {

       @Override
       public void onClick(View v) {

            MessagesActivity.list.getChildAt(((int) MessagesActivity.list.getItemIdAtPosition(position))-MessagesActivity.list.getFirstVisiblePosition()).findViewById(R.id.top_header).setBackgroundResource(R.layout.list_selector);

       }

    .
    .
    .
    }

Может быть, это может помочь вам

у меня работает

0 голосов
/ 20 марта 2012

Я думаю, вы упомянули нечто подобное в другом посте. Я упоминал, что ты не должен делать это. Вам необходимо ознакомиться с функциональностью onClick ().

public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null)
        vi = inflater.inflate(R.layout.list_row_custom_listview, null);

    //Make them final so that you can access them in your onClick()
    final TextView artist = (TextView)vi.findViewById(R.id.artist); // artist name 
    final TextView tx =(TextView)vi.findViewById(R.id.txtLink); 
    TextView link = (TextView)vi.findViewById(R.id.txtLink);



    // Setting all values in listview 
    artist.setText(song.get(Main_Activity_Custom_Listview.KEY_TITLE_ENGLISH));

    link.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
        int duration = Toast.LENGTH_SHORT;

        Log.v("link>>", "onItemClick at position" + artist.getText());

        }
    }); 
    return vi;
}
0 голосов
/ 20 марта 2012

Проблема в этой строке link.setOnClickListener(...., вы устанавливаете OnClickListener для TextView link, так что TextView будет параметром View, передаваемым вашему обратному вызову onClick, и вы определенно не сможете получить(findViewById) ваш художник вид из него.

Я думаю, вы намеревались сделать vi.setOnClickListener().Тем не менее, я не думаю, что вы намеревались сделать соответствующий , так как есть обратный вызов onItemClick, который вы можете переопределить для своего ListView, вам не нужно устанавливать OnClickListener для каждого из ваших элементов списка.как то, что вы делаете в фрагменте кода.

РЕДАКТИРОВАНИЕ:

Посмотрите на AdapterView.OnItemClickListener .

И тогда вы будете делать что-то вроде этого:

OnItemClickListener onItemClickListener = new OnItemClickListener() {
    onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // handle click events for you list view here.
        // for the parameters, see the link above. 
    }
};
myListView.setOnItemClickListener(onItemClickListener);
...