2011-10-24 17 views
0

私はアクティビティとスレッドを持っています。スレッドはデータを処理します(後で、データはインターネットアクティビティから取得されますが、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要素を変更することはできません

+0

2つのこと...私は 'notifyDataSetChanged'をUIスレッドでのみ実行すると思われますが、間違っている可能性があります。第二に、 'notifyDataSetChanged'は、アダプタの' add'、 'insert'、' remove'および 'clearメソッドを使うときにのみ動作します。基本アレイを再割り当てしているように見えますが、これは問題の可能性があります。 [この質問](http://stackoverflow.com/questions/3669325/notifydatasetchanged-example)を参照してください。 – Craigy

+0

Ahm ..あなたが話している機能を追加したり、追加したり、削除したりする必要がありますか?私のアダプタはそれらを提供しません、私は別のタイプのアダプタを使用する必要がありますか? – user982962

+0

ようこそstackoverflowへ!あなたが特定の応答を見つけたら、それを投票してください。特定の回答が正しい場合は、その回答の横にあるチェックマークをクリックして受け入れてください。 –

答えて

0

をappretiatedされます。別のスレッドからUI要素を変更する場合は、関数runOnUiThreadを呼び出す必要があります。それはあなたがあなたのスレッドで次の呼び出しを行うことができますので、それのコンストラクタで更新クラスに活動にrefernceに合格する必要があります意味:

activity.runOnUiThread(new Runnable(){ 
    public void run(){ 
    EL.g.setFocusableInTouchMode(true); 
    } 
}); 

言った、私があなただったら、私はこれをスクラップしたいです代わりにAsyncTaskLoaderを使用してください。それははるかに簡単で、クラスはリストビューのようなものに要素を非同期にロードするために特別に作成されました。今書いたコードは、うまく動作せず、すべての種類のエラーが発生しがちです。アンドロイドでは、大まかに言うと、あなたがしなければならない限り、生のThreadクラスを使用しないことです。 AsyncTaskLoader、AsyncTask、IntentServiceのいずれかを使用します。

最後に、APIレベルが10未満の場合は、アンドロイドSupport Packageを使用してAsyncTaskLoaderクラスにアクセスできます。

+0

30分ほどでこのソリューションをテストできます。事前にお返事ありがとうございます! – user982962

+0

私は今あなたが言ったことを試してみることになっています。私が言ったことは、私が書いたコード例がうまくいったということです。しかし、あなたはおそらく正しいでしょう。私は通常のJavaを学んだだけで、これをAndroidに適用しようとしていますが、そこのガイドと例を理解しようとしています。だからこそ、多くの場合、私はかなり効率的ではない解決策を持っているかもしれません。 – user982962

+0

これは聞こえにくいかもしれません。これは問題を解決しませんでした。実際、私は、変更を全く行わずに.notifyDataSetChanged()を呼び出すだけでは問題があることを発見しました。 – user982962

関連する問題