この質問は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があるべき場所の一番上にピーターがいることに注意してください。
そこにあるべきもののリスト:
- アドレスヘッダー
- カナム
- 従業員ヘッダー
- デイブ
- ブレント
- スティーブン
- Moacir
- ピーター
- リンダ
ビューがめちゃくちゃになっている場合でも、ビューをクリックすると、正しいダイアログボックスがポップアップ表示されます。上記のように。
起こっていないことは次のとおりです。
- 繰り返しのビューはありません
- 間違った場所にセクションヘッダーが描画されていません
- コマンドとして描画されるセクションヘッダーはありません(アドレスまたは連絡先の場合があります)。
私はそこにいるような気がします。 私は何を逃したでしょうか?
元の質問:
これは現在私が行っていることです。状況を単純化して、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;
}
よろしくお願いします!そして私はあなたが持っているかもしれないどんな質問にも答えます。