0

この質問は2回目に編集されました。元の質問を表示するには、「元の質問」と表示されている場所まで下にスクロールしてください。それ以降の編集については、「編集番号」セクションまで下にスクロールしてください。

2つ編集:

この編集は、getView()で必要な要素をどこに設定したかを確認するというLuksprogの要求に対応しています-convertViewがnullかどうかをチェックした後。

注:このコードはセミモジュラーであることを理解してください。

コード:

使用されるホルダーパターン:

public static class HeaderHolder
{
    public TextView textView;
}
public static class CommandHolder
{
    public TextView textView;
    public Button[] buttonHolder;
    public OnClickListener[] clickHolder;
}

getView()メソッド-設定が行われる場所:

    switch(type)
    {
        case 0: // Is a header
            String temp = commandLabel.replace("Section:", "");
            headerHolder.textView.setText(temp);
            break;
        case 1:// Is a command
            commandHolder.textView.setText(commandLabel);
            ArrayList<String[]> commands = commandCreator.getCommands();

            // Initially set the visibility of buttons to GONE
            for (int i = 0; i <commandHolder.buttonHolder.length; i++)
            {
                commandHolder.buttonHolder[i].setVisibility(View.GONE);
            }
            // Only show buttons based on how many commands there are
            for (int i = 0; i < commands.size(); i++)
            {
                pos = i;
                commandHolder.buttonHolder[i].setVisibility(View.VISIBLE);

                drawable_normal = commands.get(i)[1];
                drawable_pressed = commands.get(i)[1] + "_pressed";

                buttonStates = new StateListDrawable();
                buttonStates.addState(new int[]{statePressed}, ApplicationConstants.moduleImageLoader.findImageByName(drawable_pressed));
                buttonStates.addState(new int[]{-statePressed}, ApplicationConstants.moduleImageLoader.findImageByName(drawable_normal));
                buttonStates.addState(new int[]{}, ApplicationConstants.moduleImageLoader.findImageByName(drawable_normal));
                commandHolder.buttonHolder[i].setBackgroundDrawable(buttonStates);

                // Retrieve the intent and parameter from the current command
                String parameter = commands.get(i)[2];
                String intentName = commands.get(i)[0];

                if(intentName.contains("Call Phone"))
                {
                    commandHolder.clickHolder[i] = new OnClickListener()
                    {
                        public void onClick(View arg0)
                        {
                            //con.startActivity(call_phone);
                        }
                    };
                }
                else if(intentName.contains("Cell"))
                {
                    commandHolder.clickHolder[i] = new OnClickListener()
                    {
                        public void onClick(View arg0)
                        {
                            //con.startActivity(call_cell);
                        }
                    };
                }
                else if(intentName.contains("Map"))
                {
                    commandHolder.clickHolder[i] = new OnClickListener()
                    {
                        public void onClick(View arg0)
                        {
                            //con.startActivity(load_map);
                        }
                    };
                }
                else if(intentName.contains("Email"))
                {
                    commandHolder.clickHolder[i] = new OnClickListener()
                    {
                        public void onClick(View arg0)
                        {
                            //con.startActivity(send_email); 
                        }};
                }
                commandHolder.buttonHolder[i].setOnClickListener(commandHolder.clickHolder[i]);
            }
            convertView.setOnClickListener(new OnClickListener()
            {
                public void onClick(View arg0)
                {
                    Dialog dialog = new Dialog(ApplicationConstants.ref_currentActivity);
                    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                    LinearLayout listDialogBoxlayout = new ListDialogBox(con, commandType, commandLabel, commandInfo);
                    dialog.setContentView(listDialogBoxlayout);
                    dialog.setCancelable(true);
                    dialog.show();
                }
            });
            break;
    }
    return convertView;

質問:問題が視覚的に発生していることを確認します。下にスクロールして[1つ編集]を表示し、スクリーンショットを確認してください。

ご不明な点がある場合、または説明が必要な場合は、コメントを残してください。折り返しご連絡いたします。

1つ編集: 変更を加えましたが、それでも同じ動作

getItemViewType()を使用したgetView()メソッドの新しい実装は次のとおりです。次のチェックを行います。

if(convertView == null)
{
   switch type
      case header:
        convertView = inflate a header
        headerHolder.textView = convertView.findViewById(headerTextId);
        convertView.setTag(headerHolder);
      break;
      case command:
        convertView = inflate a command
        // Use CommandHolder to initialize all the necessary elements   
        commandHolder.textView = convertView.findViewById(commandLabel);
        . 
        .
        convertView.setTag(commandHolder);
      break;
}
else
{
   switch(type)
      case header : 
         headerHolder = convertView.getTag(); 
      break;
      case command : 
         commandHolder = convertView.getTag();
         break;

}
// set the actual elements
switch(type)
   case:header
      //set all elements in header
   break;
   case: command
      //set all elements in command
   break;
 return convertView;

何が起こっていますか:

私は視覚的な人間なので、これが役立つと思いました:スクリーンショットをいくつか示します:スクロールなし-すべてが素晴らしく見えます

ここに画像の説明を入力してください

マウススクロールでスクロールしても、すべてが見栄えがします

ここに画像の説明を入力してください

リストをクリックして下にドラッグしてスクロールします-Lindaがどこにあるべきか、canamが一番下にあることに注目してください。

ここに画像の説明を入力してください

リストをクリックして上にドラッグしてスクロールします-canamがあるべき場所の一番上にピーターがいることに注意してください。

ここに画像の説明を入力してください

そこにあるべきもののリスト:

  1. アドレスヘッダー
  2. カナム
  3. 従業員ヘッダー
  4. デイブ
  5. ブレント
  6. スティーブン
  7. Moacir
  8. ピーター
  9. リンダ

ビューがめちゃくちゃになっている場合でも、ビューをクリックすると、正しいダイアログボックスがポップアップ表示されます。上記のように。

起こっていないことは次のとおりです。

  1. 繰り返しのビューはありません
  2. 間違った場所にセクションヘッダーが描画されていません
  3. コマンドとして描画されるセクションヘッダーはありません(アドレスまたは連絡先の場合があります)。

私はそこにいるような気がします。 私は何を逃したでしょうか?


元の質問:

これは現在私が行っていることです。状況を単純化して、convertViewで質問するだけで、他のViewCreatorと混同しないようにしました。

私のListViewAdapterが持っているメソッド:

getItemViewType(...)

getViewTypeCount(...)

getView(int position, View convertView, ViewGroup parent)
{
    int type = getItemViewType(position);
    if(listItem is section)
    {    
          if(convertView == null)
          {  
              ViewGroup viewGroup = inflate a view
              Holder.textView = textview;
              viewgroup.setTag(holder);
              view = viewGroup;
          }
          else
          {
              holder = (HeaderHolder) convertView.getTag();
              view = convertView;
          }
     }
     else 
     // different layout. Complicated list item in the form: 
     //|TextView  Button1 Button2 Button3| , where buttons only appear based on 
     //a CommandCreator. If john(TextView) has a phone and email - it displays:
     // |John PhoneButton EmailButton| 
     {
           if(convertView == null)
           {
               // inflate view
               // make buttons 
               // make onclicks null
               // set different holder
               viewgroup.setTag(holder)
               view = viewgroup;
           }
           else
           {
               view = convertView;
               holder = (CommandHolder) convertView.getTag(); 
           }
           // set the buttons to show based on commands
           // set the onclick listeners to the buttons to call certain intents based on  the command
     }
     return view;
 }

}

質問: getItemViewTypeとgetViewTypeCountをどのように使用する必要がありますか?ビューグループと現在の所有者をどのように使用しますか?次のように動作しますか?

  getView
  {
       type = getItemViewType;
       if(convertView == null)
       {
           switch(type)
              case: header
                  convertView = inflate header view
                  intialize HeaderHolder
                  break;
              case: command
                  convertView = inflate command view
                  initialize CommandHolder
                  break;
       }
       else
       {
            switch(type)
                case: header
                       //Actually set all the HeaderHolder Stuff
                   String temp = commandLabel.replace("Section:", "");
                   holder.textView.setText(temp);
                   LinearLayout.LayoutParams textViewParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
                   holder.textView.setLayoutParams(textViewParams);
                   return view;
                               QUESTION : But how do I use Viewgroups, and my holder. and what am I returning?
                      break;
                case: command
                     Actually set all the commandHolder stuff
                     QUESTION : Same as above.
                     break;
        }
        return convertView?
  }

これが私のハンドラーです。

public static class HeaderHolder
{
    public TextView textView;
}
public static class CommandHolder
{
    public TextView textView;
    public Button[] buttonHolder;
    public OnClickListener[] clickHolder;
}

よろしくお願いします!そして私はあなたが持っているかもしれないどんな質問にも答えます。

4

2 に答える 2

1

これらの2つの方法について:

  • getViewTypeCount()は、レイアウトのタイプの数を返します。この場合は2です。

  • getItemViewType()intは、指定されたパラメーターに基づいて、 (0たとえば、ヘッダーレイアウトの場合)または1(通常の行レイアウトの場合)を返します。これは、実際にはデータと、リスト内のヘッダーと通常の行をどのように設定するかによって異なります。

最後の編集に関しては、特にそれらへの参照があるため、行レイアウトにデータを適切に設定しない可能性がありますOnClickListeners。このブロックから完全なコードを投稿する必要があります。

// set the actual elements
switch(type)
   case:header
      //set all elements in header
   break;
   case: command
      //set all elements in command
   break;

これは、複数の異なる行レイアウトタイプを実装する例で私が書いたサンプルコードですViewHolders(アダプターのこの側面に関して問題がある場合)。

于 2012-11-11T18:38:03.813 に答える
1

このコードを試してみてくださいこれはあなたを助けるかもしれません...

if(convertView == null)
{
   switch type
      case header:
        convertView = inflate a header
        headerHolder.textView = convertView.findViewById(headerTextId);
        convertView.setTag(headerHolder);
      break;
      case command:
        convertView = inflate a command
        // Use CommandHolder to initialize all the necessary elements   
        commandHolder.textView = convertView.findViewById(commandLabel);
        . 
        .
        convertView.setTag(commandHolder);
      break;
}
else
{
   switch(type)
      case header : {
         if(convertView.getTag() instanceOf HeaderHolder){
             headerHolder = convertView.getTag(); 
         } else {
             headerHolder = inflate a header
             convertView.setTag(headerHolder);
         }
      }
      break;
      case command : {
         commandHolder = convertView.getTag();
         if(convertView.getTag() instanceOf CommandHolder){
             commandHolder = convertView.getTag(); 
         } else {
             commandHolder = inflate a command
             convertView.setTag(commandHolder );
         }
      }
      break;

}
// set the actual elements
switch(type)
   case:header
      //set all elements in header
   break;
   case: command
      //set all elements in command
   break;
 return convertView;
于 2012-11-11T18:46:41.617 に答える