私はアクティビティとスレッドを持っています。スレッドはデータを処理します(後で、データはインターネットアクティビティから取得されますが、10秒ごとに自動的に新しい行が追加されます)。問題は、新しい行を追加した後、もうアイテムに触れることができず、フォーカスを取り戻すことができず、ハードウェアのキーボードまたはメニューボタンの上下の矢印を押す必要があります。 もちろん、最初に.setFocusableOnTouchModeをtrueに再設定することを考えましたが、これは私の問題を解決するようには見えませんでした。少なくとも、私は正しい場所に置いていません。今Android:My ListViewデータに新しい行を追加した後、タッチモードで行を選択できません
$
package com.ejemplolisbox;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class EL extends Activity {
/**
* @see android.app.Activity#onCreate(Bundle)
*/
public Refresh actualizar;
// The thread
public static ListView g;
public static EfficientAdapter instance ;
// The adapter (is a custom made adapter, I didn't do it myself, just grabbed it from the Internet)
public static String[] abbreviations = { "Item0",
"Item1", "Item2"};
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
g = (ListView) findViewById(R.id.lv_country);
g.setFocusable(true);
g.setFocusableInTouchMode(true);
instance = new EfficientAdapter(this);
// The adapter is now set to this instance
g.setAdapter(instance);
actualizar = new Refresh();
actualizar.start();
//I start the thread
g.setOnFocusChangeListener(new OnFocusChangeListener() {
public void onFocusChange(View arg0, boolean arg1) {
// TODO Auto-generated method stub
// Code should be here (??)
}
});
g.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView a, View v, int position,
long id) {
//use position to get clicked position
//your code goes here
}
});
}
public static class EfficientAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public EfficientAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return abbreviations.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.rowlayout, null);
holder = new ViewHolder();
holder.text1 = (TextView) convertView
.findViewById(R.id.TextView01);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text1.setText(abbreviations[position]);
return convertView;
}
static class ViewHolder {
TextView text1;
}
}
}
OKスレッド:
活動:とにかく、これは私のコードです。
package com.ejemplolisbox;
public class Refresh extends Thread{
public void run(){
while(true){
String[] ex=EL.abbreviations;
String[] ne=new String[ex.length+1];
for(int i=0;i<ex.length;i++){
ne[i]=ex[i];
}
ne[ex.length]="newItem"+ex.length;
EL.abbreviations=ne;
try{
EL.instance.notifyDataSetChanged();
EL.g.setFocusableInTouchMode(true);
}
catch(Exception e){
int i = 0;
EL.g.setFocusableInTouchMode(true);
}
EL.g.setFocusableInTouchMode(true);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
まあ、事前のおかげで、すべてのソリューションは、あなたが直接、UIスレッドではないスレッドからUI要素を変更することはできません
2つのこと...私は 'notifyDataSetChanged'をUIスレッドでのみ実行すると思われますが、間違っている可能性があります。第二に、 'notifyDataSetChanged'は、アダプタの' add'、 'insert'、' remove'および 'clearメソッドを使うときにのみ動作します。基本アレイを再割り当てしているように見えますが、これは問題の可能性があります。 [この質問](http://stackoverflow.com/questions/3669325/notifydatasetchanged-example)を参照してください。 – Craigy
Ahm ..あなたが話している機能を追加したり、追加したり、削除したりする必要がありますか?私のアダプタはそれらを提供しません、私は別のタイプのアダプタを使用する必要がありますか? – user982962
ようこそstackoverflowへ!あなたが特定の応答を見つけたら、それを投票してください。特定の回答が正しい場合は、その回答の横にあるチェックマークをクリックして受け入れてください。 –