-1

ListFragment를 만들려고합니다. 나는 Api Demo (FragmentLayout)를 보았다. 그것은 간단한 예제에서 작동하고 이제는 기존 프로젝트에 적용하고 싶습니다.listFragment가있는 사용자 정의 arrayAdapter

여기 내 코드입니다. Api 데모와 마찬가지로 내부 클래스 (RecipeList & RecipeDetail)를 생성합니다.

public class InfoActivity extends MenuActivity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.info_fragment_layout); 

    // ... 


} 

    public static class RecipeList extends ListFragment { 

    private int mCurrentSelectedItemIndex = -1; 
    private boolean mIsTablet = false; 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 



     accountData = new ArrayList<Account>(); 


     new AccountSyncTask() { 
      @Override 
      public void onPostExecute(
        final ArrayList<ArrayList<String>> result) { 

        // For each retrieved account 
              Bd.insert(retrievedAccount); 
        accountData.add(retrievedAccount); 
       } 

       accountListAdapter = new AccountListAdapter(
         InfoActivity.this, R.layout.accountlist_detail, 
         accountData); 

       accountListAdapter = new AccountListAdapter(
         activityContext, R.layout.accountlist_detail, 
         accountData); 
       setListAdapter(accountListAdapter); 


      } 
     }.execute(sessionName, null, "getAllObjectOnServer", 
       String.valueOf(nbRow)); 


     if (savedInstanceState != null) { 
      mCurrentSelectedItemIndex = savedInstanceState.getInt(
        "currentListIndex", -1); 
     } 

     // This is a tablet if this view exists 
     View recipeDetails = getActivity() 
       .findViewById(R.id.recipe_details); 
     mIsTablet = recipeDetails != null 
       && recipeDetails.getVisibility() == View.VISIBLE; 


     if (mIsTablet) { 
      getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     } 


     if (mIsTablet && mCurrentSelectedItemIndex != -1) { 
      showRecipeDetails(); 
     } 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     mCurrentSelectedItemIndex = position; 
     showRecipeDetails(); 
    } 

    private void showRecipeDetails() { 
     if (mIsTablet) { 

      // Set the list item as checked 
      getListView().setItemChecked(mCurrentSelectedItemIndex, true); 

      // Get the fragment instance 
      RecipeDetail details = (RecipeDetail) getFragmentManager() 
        .findFragmentById(R.id.recipe_details); 
      // Is the current visible recipe the same as the clicked? If so, 
      // there is no need to update 
      if (details == null 
        || details.getRecipeIndex() != mCurrentSelectedItemIndex) { 

       details = RecipeDetail 
         .newInstance(mCurrentSelectedItemIndex); 

       FragmentTransaction ft = getFragmentManager() 
         .beginTransaction(); 
       ft.replace(R.id.recipe_details, details); 

       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
       ft.commit(); 
      } 
     } else { 

     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("currentListIndex", mCurrentSelectedItemIndex); 
    } 

} 

public static class RecipeDetail extends Fragment { 

    private int mRecipeIndex; 

    public static RecipeDetail newInstance(int recipeIndex) { 
     // Create a new fragment instance 
     RecipeDetail detail = new RecipeDetail(); 
     // Set the recipe index 
     detail.setRecipeIndex(recipeIndex); 
     return detail; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     if (container == null) { 
      return null; 
     } 


     View v = inflater 
       .inflate(R.layout.recipe_details, container, false); 
     //.. 

     return v; 
    } 

    public int getRecipeIndex() { 
     return mRecipeIndex; 
    } 

    public void setRecipeIndex(int index) { 
     mRecipeIndex = index; 
    } 

} 

사용자 정의 ArrayAdapter가 있습니다 (ListFragment의 항목에 4 개의 textView와 clickable imageButton이 있습니다).

AccountListAdapter :

public class AccountListAdapter extends ArrayAdapter<Account> { 

private final Context context; 
private final int layoutResourceId; 
private final ArrayList<Account> data; 


public AccountListAdapter(Context context, int layoutResourceId, 
     ArrayList<Account> data) { 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 


} 



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

    AccountHolder holder = null; 

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

     holder = new AccountHolder(); 

     convertView.setClickable(true); 
     convertView.setFocusable(true); 

     holder.txtName = (TextView) convertView.findViewById(R.id.nom); 
     holder.txtId = (TextView) convertView.findViewById(R.id.id); 

     convertView.setTag(holder); 

    } else { 
     holder = (AccountHolder) convertView.getTag(); 
    } 

    convertView.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      Log.i("click", "index = " + position); 

     } 

    }); 

    holder.txtName.setText(data.get(position).getName()); 
    holder.txtId.setText(data.get(position).getId()); 

    convertView.setBackgroundResource(R.drawable.list_selector); 

    ImageButton img = (ImageButton) convertView.findViewById(R.id.check); 
    img.setTag(position); 

    return convertView; 
} 

static class AccountHolder { 
    TextView txtName; 
    TextView txtId; 
} 

}

문제 : 내가 listFragment의 항목을 클릭

public void onListItemClick(ListView l, View v, int position, long id) { 
     mCurrentSelectedItemIndex = position; 
        Log.i("click", "here"; 
     showRecipeDetails(); 
    } 

가 호출되지 않고 AccountListAdapter에 정의 된 항목 리스너 작품

convertView.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      Log.i("click", "index = " + position); 

     } 

    }); 

왜 onListitemClick을 호출하지 않습니까?

또 다른 질문 : 목록을 채우기 위해 내 ListFragment의 onActivityCreated 함수에서 다른 스레드의 웹 서비스를 사용하는 것이 적절한 방법입니까? 사전에

들으 내가 "showRecipeDetails"정적 및 내 사용자 지정 ArrayAdapter와의 리스너에 전화를 만든 순간

편집 =. 나는 내 솔루션에 만족하지 않다

convertView.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      RecipeList.showRecipeDetails(position); 
}} 

는, 내가

답변

1

OnItemClickListeners 먼저 당신이 클릭을 기록 할의 ListView에 연결되어 있어야합니다 다른 솔루션에 interessed하고 있습니다. onActivityCreated(..) 방법에서 getListView().setOnItemClickListener(this)을 어딘가에 넣고 public static class RecipeList extends ListFragment 뒤에 implements OnItemClickListener을 입력합니다.

+0

대답은 Thx이지만 작동하지 않습니다. 내 훈련 샘플 (http://android-developers.blogspot.fr/2011/02/android-30-fragments-api.html)을 사용하면 목록을 OnItemClickListener와 연결할 필요가 없습니다. 사용자 정의 ArrayAdapter로 작업하면 몇 가지 문제가 발생합니다. – yoann

+0

이 답변은 저에게 효과적이었습니다. 감사합니다. Espiandev – Redshirt