0

他のすべてのので、行をクリックしたときに、私は、リストビューの単一の行内(目に見えないのTextViewを作り、例えば)ビュー/ UIを更新する方法を思っていました行のビューも同様に影響を受けます。 Google Playミュージックで曲を再生するなど、イコライザーのアニメーションが適切に表示されます。リストビューの単一の列内のビューを更新する

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); // Renders only a ListView 

    ListView songListView = (ListView) findViewById(R.id.list); 
    List<Song> songList = new ArrayList<>(); 
    for (int i = 1; i <= 200; i++) songList.add(new Song("Song" + i, "Artist" + i)); 
    SongAdapter songAdapter = new SongAdapter(this, songList); 
    songListView.setAdapter(songAdapter); 
    songListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long l) { 
      if (position == view.getId()) { 
       TextView titleText = (TextView) view.findViewById(R.id.song_title); 
       titleText.setVisibility(View.INVISIBLE); 
      } 
     } 
    }); 
} 

...と私のArrayAdapterのGetViewメソッドとViewHolderクラス:

MainActivityののonCreate():ここに私のスニペットがある

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 

    if (convertView == null) { 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, 
       false); 

     holder = new ViewHolder(); 
     holder.song = (TextView) convertView.findViewById(R.id.song_title); 
     holder.artist = (TextView) convertView.findViewById(R.id.song_artist); 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    convertView.setId(position); 

    Song currentSong = getItem(position); 

    if (currentSong != null) { 
     holder.song.setText(currentSong.getTitle()); 
     holder.artist.setText(currentSong.getArtist()); 
    } 

    return convertView; 
} 

private static class ViewHolder { 
    TextView song; 
    TextView artist; 
} 

答えて

0

が、私はついにからの助けを得た後、これを考え出しました私の指導者。

MainActivity:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ListView songListView = (ListView) findViewById(R.id.list); 
     List<Song> songList = new ArrayList<>(); 
     for (int i = 1; i <= 200; i++) songList.add(new Song("Song" + i, "Artist" + i)); 
     final SongAdapter songAdapter = new SongAdapter(this, songList); 
     songListView.setAdapter(songAdapter); 
     songListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long l) { 
       songAdapter.setSongPosition(position); 
       songAdapter.notifyDataSetChanged(); 
      } 
     }); 
    } 
} 

カスタムソングクラス:

public class Song { 
    private String mSongTitle, mSongArtist; 

    public Song(String songTitle, String songArtist) { 
     mSongTitle = songTitle; 
     mSongArtist = songArtist; 
    } 

    public String getSongTitle() { 
     return mSongTitle; 
    } 

    public String getSongArtist() { 
     return mSongArtist; 
    } 
} 

カスタムアダプタ:

を次のようにリスト内の前の位置の記録を保持するためのアダプタでint型のフィールドを初期化すると、トリックをしました
public class SongAdapter extends ArrayAdapter<Song> { 
    private int currentlyPlaying = -1; 

    public SongAdapter(Context context, List<Song> songList) { 
     super(context, 0, songList); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 

     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, 
        false); 

      holder = new ViewHolder(convertView); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     Song song = getItem(position); 
     holder.song.setText(song.getSongTitle()); 
     holder.artist.setText(song.getSongArtist()); 

     // Hides the row, so both TextViews. Otherwise, sets each row visible. 
     if (position == currentlyPlaying) convertView.setVisibility(View.INVISIBLE); 
     else convertView.setVisibility(View.VISIBLE); 

     return convertView; 
    } 

    private class ViewHolder { 
     private TextView song; 
     private TextView artist; 

     private ViewHolder(View itemView) { 
      song = (TextView) itemView.findViewById(R.id.song_title); 
      artist = (TextView) itemView.findViewById(R.id.artist); 
     } 
    } 

    public void setSongPosition(int position) { 
     currentlyPlaying = position; 
    } 
} 
0

希望はこのことができます:

holder.song.setId(position); 

コードは次のようになります。

mSongView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long l) { 
    Log.d(LOG_TAG, "Song item clicked"); 
    TextView titleText = (TextView) view.findViewById(position); 
    titleText.setVisibility(View.INVISIBLE); 

} 
}); 
+0

ありがとうございますが、他のすべてのビューはまだ消えています。 – DaveNOTDavid

0

あなたviewholderクラス

class ViewHolder implements View.OnClickListener { 

TextView song; 
TextView artist; 

ViewHolder(View itemView) { 
    super(itemView); 
    song = (TextView)itemView.findViewById(R.id.txt1); 
    artist = (TextView)itemView.findViewById(R.id.txt2); 
    itemView.setOnClickListener(this); 

} 

@ Override 
public void onClick(View v) { 
    listener.onClick(v); 
} 

を変更し、最後に、あなたのActivityクラスに

class MainActivity extends AppCompatActivity implements YourAdapter.OnItemClickListener{ 
@Override 
public void onClick(View view) { 
    TextView titleText = (TextView) view.findViewById(R.id.song_title); 
     titleText.setVisibility(View.INVISIBLE); 
} 

}

をインターフェイスを実装するアダプタクラスで

public interface OnItemClickListener { 
void onClick(View view);} 
private final OnItemClickListener listener; 
public YourAdapter(Context mContext, OnItemClickListener listener) { 
this.mContext = mContext; 
this.listener = listener;} 

を以下のコードを追加します。

+0

残念ながら、これはうまくいきません。少なくとも、私が再構成したコードでは、できる限り毎回私の最新の投稿をチェックしてください! – DaveNOTDavid

+0

更新されたコードが適切だと思われる場合は、この値を記録してみてください。int adapterPosition = getAdapterPosition(); viewholderクラスのonclickで –

1

各行に対する可視性を作るためにあなたの歌のモデルクラスに1つのより多くの変数を追加し、コードの下にこれを試してください。

class Song{ 
    private boolean isShowing =false; 

    public boolean isShowing() { 
     return isShowing; 
    } 

    public void setShowing(boolean showing) { 
     isShowing = showing; 
    } 
} 

SongsAdapter.class

class SongAdapter extends BaseAdapter { 
      private Context mContext; 
      private List<Song> mSongList; 


      public SongAdapter(Context context, List<Song> songs) { 
       mContext = context; 
       mSongList = songs; 
      } 

      @Override 
      public int getCount() { 
       return mSongList.size(); 
      } 

      @Override 
      public Object getItem(int i) { 
       return null; 
      } 

      @Override 
      public long getItemId(int i) { 
       return 0; 
      } 

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

       if (convertView == null) { 
        convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, 
          false); 
        holder = new ViewHolder(convertView); 

        convertView.setTag(holder); 
       } else { 
        holder = (ViewHolder) convertView.getTag(); 
       } 

       final Song songModel = mSongList.get(position); 
       holder.song.setText(songModel.getSongTitle()); 
       holder.artist.setText(songModel.getSongArtist()); 

       if(songModel.isShowing()){ 
        holder.song.setVisibility(View.VISIBLE); 
       }else{ 
        holder.song.setVisibility(View.GONE); 
       } 
       convertView.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         if(songModel.isShowing()){ 
          songModel.setShowing(false); 
         }else{ 
          songModel.setShowing(true); 
         } 

         notifyDataSetChanged(); 

        } 
       }); 
       return convertView; 
      } 

      public class ViewHolder{ 
       TextView song; 
       TextView artist; 

       public ViewHolder(View itemView) { 
        song = (TextView)itemView.findViewById(R.id.song_title); 
        artist = (TextView)itemView.findViewById(R.id.artist); 

       } 

      } 
     } 
+0

これは機能しますが、私はここに示したように簡単な解決策を思いつきました。 – DaveNOTDavid

関連する問題