2016-04-09 23 views
0

リストビューで選択した項目の背景を変更することができます。リストが作成されると、最初の項目の背景が強調表示されます。次のコードは、 "performItemClick"を実行しようとするとエラーが発生します。作成時にリストビューの最初の項目をハイライト表示

アレイアダプタでgetViewを変更する方法があります。しかし、JavaコードにMyCustomAdapterクラスを作成しようとすると、「Android.widget.ArrayAdapterにデフォルトの構造はありません」というエラーが表示されます

これを行うにはArrayAdapterクラスの拡張を作成する必要がある場合は、どのように私はこのエラーを回避します。私は提案を開いています別の方法がある場合。

おかげ

package com.hofficer.aclsfast; 

import android.app.Activity; 
import android.content.pm.ActivityInfo; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.ListAdapter; 
import android.widget.ListView; 

import java.lang.reflect.Array; 

public class NarrowChild extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_narrow_child); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     //fix orientation 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     //MyCustomAdapter adapter = new MyCustomAdapter(); 
     createList(); 
    } 
    /* 
    class MyCustomAdapter extends ArrayAdapter{ 

    }*/ 

    void createList(){ 
     String[] narrowChoices = {"aFib/Flutter", "Narrow Cmplx Tachycardia", "PSVT", "Junctional Tachycardia", "Multifocal Tachycardia"}; 

     ListAdapter theAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, narrowChoices); 
     final ListView listview = (ListView) findViewById(R.id.narrowListView); 

     listview.setAdapter(theAdapter); 

     listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 


      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { 
       //clear menu and highlight selected item 
       for (int i = 0; i < 5; i++) { 
        listview.getChildAt(i).setBackgroundColor(Color.WHITE); 
       } 
       listview.getChildAt(position).setBackgroundColor(Color.CYAN); 
      } 
     }); 
     Boolean result = listview.performItemClick(listview,0,0); //THIS GIVES ERROR NULL POINT EXCEPTION 
    } 
} 
+0

CustomArrayAdpterを使用しますか? – Krish

+0

どうすればいいですか?アクティビティクラス内でクラスを作成しようとしましたが、最初の質問で述べたエラーが発生しています。 – imsmooth

+0

あなたの要件は常に最初の行を強調表示することですか? – Krish

答えて

0

私は今それをテストすることはできませんが、あなただけlistview.getChildAt(0).setBackgroundColor(Color.CYAN);の代わりBoolean result = listview.performItemClick(listview,0,0);を呼び出すことはできません?

+0

私はそれを試みましたが、私はヌルポイントエラーを取得します。私はonItemClickルーチン内からgetChildAtにアクセスできますが、他の場所ではエラーが発生しません。 – imsmooth

0

これを試してみてください:

Boolean result = listview.performItemClick(listview.getAdapter().getView(0),0,0); 

か:

Boolean result = listview.performItemClick(listview.getAdapter().getView(0, null, null),0,0); 

このquestionを参照してくださいdocsを確認してください。

EDIT

私はあなたの問題は、getChildAt()メソッドだと思います。 thisの質問をご覧ください。

+0

私はこれとあなたの提案のバリエーションを試してみました。まだ運がありません。 – imsmooth

1

あなたのMyCustomAdapterには、ArrayAdapterの1つ以上のコンストラクタをオーバーライドするか、独自のものを作成する必要があります。カスタムアダプタの例は次のとおりです。あなたのケースでsource

から

public class WeatherAdapter extends ArrayAdapter<Weather>{ 

    Context context; 
    int layoutResourceId; 
    Weather data[] = null; 

    public WeatherAdapter(Context context, int layoutResourceId, Weather[] data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     WeatherHolder holder = null; 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new WeatherHolder(); 
      holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); 
      holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); 

      row.setTag(holder); 
     } 
     else 
     { 
      holder = (WeatherHolder)row.getTag(); 
     } 

     Weather weather = data[position]; 
     holder.txtTitle.setText(weather.title); 
     holder.imgIcon.setImageResource(weather.icon); 

     return row; 
    } 

    static class WeatherHolder 
    { 
     ImageView imgIcon; 
     TextView txtTitle; 
    } 
} 

の詳細情報は、あなたはそれが0であれば位置を確認し、目的のアイテムを返す必要があります。

+0

ありがとうございます。私はそれがあなたが言ったものに似た何かをしていることを理解しました。あなたのコメントはとても役に立ち、時間をいただきありがとうございます。 – imsmooth

関連する問題